#include "mainwindow.h"
#include "ui_mainwindow.h"

#include "randomgenerateclass.h"
#include "bubblesortclass.h"
#include "quicksortclass.h"

#include <vector>

#include <thread>//使用标准库中的线程操作

MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    /* 我这里需求是，当子线程运行完毕后，通过Qt的信号槽通知主线程
     * 因此，需要弄个类继承 QObject
     */
    // 1.创建任务类对象 因为要使用Qt的信号槽，所以要弄个类继承QObject
    RandomGenerateClass* randomGenerate = new RandomGenerateClass;
    BubbleSortClass* bubble = new BubbleSortClass;
    QuickSortClass* quick = new QuickSortClass;

    //配置连接： 点击按钮后创建一个线程产生随机数
    connect(ui->pushButton_generate, &QPushButton::clicked, this, [=]() {
        std::thread randomThread(&RandomGenerateClass::generateRandom, randomGenerate, ui->spinBox_count->value());//创建产生随机数的线程
        randomThread.detach();//分离，主线程不等待，子线程执行完毕后会发信号
    });

    //配置连接： 接收产生的随机数，并显示
    connect(randomGenerate, &RandomGenerateClass::sendVector, this, [=](std::vector<int> randomVector) {
        this->randomNumber = randomVector; // 记录产生的随机数
        ui->listWidget->clear();           // 清除之前的数据
        // 显示在随机数列表中
        for (int i = 0; i < randomVector.size() && i < 100; i++)//只展示前100个，防止界面出问题
        {
            ui->listWidget->addItem(QString::number(randomVector[i]));
        }
    });

    //配置连接： 点击排序按钮后，创建线程进行排序
    connect(ui->pushButton_sort, &QPushButton::clicked, this, [=]() {
        std::thread bubbleThread(&BubbleSortClass::sort, bubble, this->randomNumber);//创建冒泡排序的线程
        bubbleThread.detach();//分离，主线程不等待，子线程执行完毕后会发信号
        std::thread quickThread(&QuickSortClass::sort, quick, this->randomNumber);//创建快速排序的线程
        quickThread.detach();//分离，主线程不等待，子线程执行完毕后会发信号
    });

    //配置连接： 排序完毕后显示结果
    //冒泡排序
    connect(bubble, &BubbleSortClass::sortResult, this, [=](std::vector<int> resultVector) {
        ui->listWidget_bubble->clear(); // 清除之前的数据
        for (int i = 0; i < resultVector.size() && i < 100; i++)//只展示前100个，防止界面出问题
        {
            ui->listWidget_bubble->addItem(QString::number(resultVector[i]));
        }
    });
    // 快速排序
    connect(quick, &QuickSortClass::sortResult, this, [=](std::vector<int> resultVector) {
        ui->listWidget_quick->clear(); // 清除之前的数据
        for (int i = 0; i < resultVector.size() && i < 100; i++)//只展示前100个，防止界面出问题
        {
            ui->listWidget_quick->addItem(QString::number(resultVector[i]));
        }
    });
}

MainWindow::~MainWindow()
{
    delete ui;
}
